package dao;

import hbt.HibernateUtil;

import java.rmi.UnmarshalException;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import org.hibernate.Session;
import org.hibernate.SessionFactory;

import beans.ClienteBean;
import entity.ClienteEntity;
import entity.CondicionCompraEntity;
import entity.CotizacionEntity;
import entity.FacturaEntity;
import entity.ItemEntity;
import entity.ListadoPecioEntity;
import entity.OrdenCompraEntity;
import entity.OrdenPedidoEntity;
import entity.ProveedorEntity;
import entity.RemitoEntity;
import entity.RodamientoEntity;
import entity.SolicitudCotizacionEntity;
public class HibernateClienteDao {
	private static HibernateClienteDao instancia = null;
	private static SessionFactory sf = null;
	

	public static HibernateClienteDao getInstancia(){
		if(instancia == null){
			sf = HibernateUtil.getSessionFactory();
			instancia = new HibernateClienteDao();
		} 
		return instancia;
	}
	
	public void agregarCliente(ClienteEntity cliente)throws UnmarshalException{
			//cliente.setCondicionCompra(getCondiciones(cliente));
			Session session = sf.openSession();
			session.beginTransaction();
			session.merge(cliente);
			session.flush();
			session.getTransaction().commit();
			session.close();
		
	}

	@SuppressWarnings("unchecked")
	public List<ClienteEntity> obtenerCliente() {
		Session session=sf.openSession();
		List<ClienteEntity> clientes=session.createQuery("Select c from ClienteEntity c ").list();
		session.close();
		return clientes;
		
	}

	public boolean eliminarCliente(ClienteEntity cliente) {	
		Session session = sf.openSession();
		session.beginTransaction();
		ClienteEntity c=this.loadCliente(cliente);
		c.setEstado(false);
		session.merge(c);
		session.flush();
		session.close();
		return true;
	}
	
	@SuppressWarnings("unchecked")
	public ClienteEntity loadCliente(ClienteEntity cliente){
		Session session = sf.openSession();
		List<ClienteEntity> c=session.createQuery("from ClienteEntity where cuit like :cuit").setParameter("cuit",cliente.getCuit()).list();
		session.close();
		return c.get(0);
	}

	@SuppressWarnings("unchecked")
	public List<CondicionCompraEntity> obtenerCondicionCompra() {
		Session session = sf.openSession();
		List<CondicionCompraEntity> condiciones=session.createQuery("from CondicionCompraEntity").list();
		return condiciones;
	}
	
	@SuppressWarnings("unchecked")
	public List<CondicionCompraEntity> obtenerCondicioesnCompra(
			ClienteBean clienteActual) {
		Session session = sf.openSession();
		List<CondicionCompraEntity> condiciones=session.createQuery("Select cond from ClienteEntity cli join cli.condicionCompra cond where cli.cuit like :cuit ").setParameter("cuit", clienteActual.getCuit()).list();
		return condiciones;
	}

	
	@SuppressWarnings("unused")
	private List<CondicionCompraEntity> getCondiciones(ClienteEntity cliente) {
		List<CondicionCompraEntity> aux = new ArrayList<CondicionCompraEntity>();
		List<CondicionCompraEntity> cond = cliente.getCondicionCompra();
		
	 for(CondicionCompraEntity base : obtenerCondicionCompra())
		 for(CondicionCompraEntity cli : cond)
			 if(base.equals(cli))
				 aux.add(base);
		 
	 
	 cond.removeAll(aux);
	 aux.addAll(cond);
	
	 return aux;
	 
	}

	public void agregarProveedor(ProveedorEntity proveedor) throws UnmarshalException{
		Session session = sf.openSession();
		session.beginTransaction();
		session.merge(proveedor);
		session.flush();
		session.getTransaction().commit();
		session.close();
		
	}

	@SuppressWarnings("unchecked")
	public ProveedorEntity obtenerProveedor(String cuit) {
		Session session = sf.openSession();
		List<ProveedorEntity> c=session.createQuery("from ProveedorEntity where cuit like :cuit").setParameter("cuit",cuit).list();
		session.close();
		return c.get(0);
	}

	@SuppressWarnings("unchecked")
	public RodamientoEntity obtenerRodamiento(String codigo) {
		Session session=sf.openSession();
		List<RodamientoEntity> r=session.createQuery("from RodamientoEntity where codigo like :cod").setParameter("cod", codigo).list();
		session.close();
		return r.get(0);	
	}

	public void guardarListado(ListadoPecioEntity l) {
		Session session = sf.openSession();
		session.beginTransaction();
		session.merge(l);
		session.flush();
		session.getTransaction().commit();
		session.close();		
	}

	public void vincularListadoProveedor(ProveedorEntity pro) {
		Session session = sf.openSession();
		session.beginTransaction();
		session.merge(pro);
		session.flush();
		session.getTransaction().commit();
		session.close();
	}

	@SuppressWarnings("unchecked")
	public ClienteEntity obtenerCliente(String cuit) {
		Session session=sf.openSession();
		List<ClienteEntity> r=session.createQuery("from ClienteEntity where cuit like :cod").setParameter("cod", cuit).list();
		session.close();
		return r.get(0);	
	}

	public void guardarSolicitudCotizacion(SolicitudCotizacionEntity soli) {
		Session session = sf.openSession();
		session.beginTransaction();
		session.merge(soli);
		session.flush();
		session.getTransaction().commit();
		session.close();
		
	}

	@SuppressWarnings("unchecked")
	public List<RodamientoEntity> obtenerRodamientos(String codigo) {
		Session session=sf.openSession();
		List<RodamientoEntity> r=session.createQuery("from RodamientoEntity where codigo like :cod").setParameter("cod", codigo).list();
		session.close();
		return r;
	}

	public List<CondicionCompraEntity> obtenerCondicioesnCompra(
			ClienteEntity cliente) {
		Session session = sf.openSession();
		List<CondicionCompraEntity> condiciones=session.createQuery("Select cond from ClienteEntity cli join cli.condicionCompra cond where cli.cuit like :cuit ").setParameter("cuit", cliente.getCuit()).list();
		session.close();
		return condiciones;
	}

	public int obtenerNumeroPedido() {
		Session session=sf.openSession();
		List<Integer> l=session.createQuery("Select max(numero) from OrdenPedidoEntity").list();
		session.close();
		return l.get(0);
	}

	public void guardarPedido(OrdenPedidoEntity pedido) {
		Session session = sf.openSession();
		session.beginTransaction();
		session.merge(pedido);
		session.flush();
		session.getTransaction().commit();
		session.close();
	}

	public Date obtenerFechaVencimiento(int numero) {
		Session session=sf.openSession();
		List<Date> l=session.createQuery("Select fechaVencimiento from CotizacionEntity where numero like :nro ").setParameter("nro", numero).list();
		session.close();
		return l.get(0);
	}

	public CotizacionEntity ontenerCotizacion(int numero) {
		Session session=sf.openSession();
		List<CotizacionEntity> l=session.createQuery("from CotizacionEntity where numero like :num").setParameter("num", numero).list();
		session.close();
		return l.get(0);
	}

	public List<ItemEntity> obtenerItemsCotizacion(int numero) {
		Session session=sf.openSession();
		List<ItemEntity> l=session.createQuery("Select it from CotizacionEntity cot join cot.items it where cot.numero like :num ").setParameter("num", numero).list();
		session.close();
		return l;
	}

	public void guardarCotizacion(CotizacionEntity cot) {
		Session session = sf.openSession();
		session.beginTransaction();
		session.merge(cot);
		session.flush();
		session.getTransaction().commit();
		session.close();
		
	}

	public int obtenerNumeroRemito() {
		Session session=sf.openSession();
		List<Integer> l=session.createQuery("Select max(numero) from RemitoEntity").list();
		session.close();
		return l.get(0);
		
	}

	public void guardarRemito(RemitoEntity remito) {
		Session session = sf.openSession();
		session.beginTransaction();
		session.merge(remito);
		session.flush();
		session.getTransaction().commit();
		session.close();
		
	}

	public int obtenerNumeroFactura() {
		Session session=sf.openSession();
		List<Integer> l=session.createQuery("Select max(numero) from FacturaEntity").list();
		session.close();
		return l.get(0);
		
	}

	public void guardarFactura(FacturaEntity factura) {
		Session session = sf.openSession();
		session.beginTransaction();
		session.merge(factura);
		session.flush();
		session.getTransaction().commit();
		session.close();
		
	}

	public CondicionCompraEntity buscarCondicionCompra(String formaPago) {
		Session session=sf.openSession();
		List<CondicionCompraEntity> l=session.createQuery("from CondicionCompraEntity where formaDePago like :formaPago").setParameter("formaPago", formaPago).list();
		session.close();
		return l.get(0);
		
	}

	public List<ListadoPecioEntity> obtenerListado() {
		Session session=sf.openSession();
		List<ListadoPecioEntity> l=session.createQuery("from ListadoPecioEntity").list();
		return l;
	}

	public List<ListadoPecioEntity> obtenerListadosProveedor(String cuit) {
		Session session=sf.openSession();
		List<ListadoPecioEntity> l=session.createQuery("Select li from ProveedorEntity pro join pro.listados li where pro.cuit like :cuit").setParameter("cuit", cuit).list();
		return l;
	}

	public int obtenerNumeroOrdenCompra() {
		Session session=sf.openSession();
		List<Integer> l=session.createQuery("Select max(numero) from OrdenCompraEntity").list();
		session.close();
		return l.get(0);
	}

	public void guardarOrdenCompra(OrdenCompraEntity or) {
		Session session = sf.openSession();
		session.beginTransaction();
		session.merge(or);
		session.flush();
		session.getTransaction().commit();
		session.close();
		
	}

	public double obtenerGanancia() {
		Session session=sf.openSession();
		List<Double> l=session.createQuery("Select ga.ganancia from GananciaEntity ga").list();
		session.close();
		return l.get(0);
	}

	public OrdenPedidoEntity obtenerPedido(int numero) {
		Session session=sf.openSession();
		List<OrdenPedidoEntity> l=session.createQuery("from OrdenPedidoEntity where numero like :numero").setParameter("numero", numero).list();
		return l.get(0);
	}

}
